#ifndef __DATAUP_H__
#define __DATAUP_H__

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "MQTTClient.h"
#include "MQTTClientPersistence.h"
#include "MQTTProperties.h"
#include "MQTTReasonCodes.h"
#include "MQTTSubscribeOpts.h"
#include "../lib/cJSON.h"
#include "../lib/process.h"
#include "../lib/SQL.h" // 数据库头文件
#include <pthread.h>
#include <unistd.h>

// #define ADDRESS "tcp://192.168.50.103:1883"
#define CLIENTID "mqttClient"
#define TOPICDOWN "order"
#define TOPICUP "data"
#define PAYLOAD "Hello fx!"
#define QOS 1
#define TIMEOUT 10000L

// 数据上报模式枚举
typedef enum
{
    MODE_FLASH = 0, // 周期上报
    MODE_TIME,      // 定时上报
    MODE_CHANGE,    // 变化上报
} updata_mode_e;

// 给子线程传递数据
typedef struct
{
    FILE *nodeFile;                      // json文件流指针
    int mode;                            // 上报模式
    int period;                          // 上报周期
    sqlite3 *patientDB;                  // 病人库
    sqlite3 *roomDB;                     // 病房库
    sqlite3 *userDB;                     // 用户库
    std_node_t *shmaddr;                 // 共享内存地址
    int msgid;                           // 消息队列id
    MQTTClient client;                   // ＭＱＴＴ客户端
    MQTTClient_message pubmsg;           // 发布信息
    MQTTClient_deliveryToken token;      // 令牌
    MQTTClient_connectOptions conn_opts; // 连接选项
} pthread_data_t;

int flash = 0;

// 数据上报线程
void *thread_updata(void *arg);
// 数据存储子线程
void *thread_store(void *arg);
// 控制指令子线程
void *thread_cmd(void *arg);
// 订阅消息子线程
void *thread_sub(void *arg);


// 刷新的形式进行数据上报
void dataFlash(pthread_data_t *shmaddr);
// 定时的形式进行数据上报
void dataTime(pthread_data_t *shmaddr);
// 变化的形式进行数据上报
void dataChange(pthread_data_t *shmaddr);
// 数据上报
void dataUpdata(pthread_data_t *shmaddr, int number);
// 消息到达回调函数
int msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message);
// 消息发送确认回调函数
void delivered(void *context, MQTTClient_deliveryToken dt);
// 连接丢失回调函数
void connlost(void *context, char *cause);


#endif